import sys
import re

def main(value):

    gabarito_direito = {'R0':'100000000000', 'R1':'010000000000', 'R2':'001000000000', 'R3':'000100000000', 'R4':'000010000000', 'A':'000001000000', 'PC':'000000100000', 'SP':'000000010000', 'Rend':'000000001000', 'Rdados':'000000000100', 'Rinst':'000000000010', 'F':'000000000001', '[Rend]':'000000000000'}

    muxA = {'Rdados':'000', 'A':'001', 'R0':'010', 'PC':'011', 'SP':'100'}
    muxB = {'R1':'00', 'R2':'01', 'R3':'10', 'R4':'11'}

    ULA = {'OPA':'0000', 'OPB':'0001', 'inc':'0010', 'incf':'0011', '+':'0100', 'dec':'0101', 'decf':'0110', '-':'0111', 'and':'1000', 'or':'1001', 'not':'1010', 'neg':'1011', 'clr':'1100', 'shl':'1101', 'shr':'1110', 'F':'1111'}

    def gabarito_esquerdo(a, op, b, lado_dir):
        mux = (a == '[Rend]') and (lado_dir == 'Rdados')

        if (lado_dir == 'Rdados'):
            if (a == '[Rend]'):
                mux = '0'
            else:
                mux = '1'
        else:
            mux = '0'

        if a != None and op == None and b == None:
            if a == 'F':
                return ULA[a] + '000' + '00' + mux

            if a == '[Rend]':
                return '0000' + '000' + '00' + mux

            try:
                return ULA['OPA'] + muxA[a] + '00' + mux
            except:
                pass

            try:
                return ULA['OPB'] + '000' + muxB[a] + mux
            except:
                pass

            return 'PROBLEMA!!'

        if a != None and op != None and b == None:
            try:
                return ULA[op] + muxA[a] + '00' + mux
            except:
                pass

            try:
                return ULA[op] + '000' + muxB[a] + mux
            except:
                pass

            return 'PROBLEMA!!'

        if a != None and op != None and b != None:
            try:
                return ULA[op] + muxA[a] + muxB[b] + mux
            except:
                pass

            return 'PROBLEMA!!'
            


    file = open('pasta_aux/[' + value + ']conjuntoMicroinstrucoes.txt', 'r')
    lines = file.readlines()
    file.close()


    file_out = open('pasta_aux/[' + value + ']microinstrucoes.txt', 'w')
    bits = []
    for l in lines :
        s = l.strip().replace("\n", "").replace("\t", "").split(" <- ")
        micro = ''

        if (len(s) > 1):
            lado_direito = s[0]
            lado_esquerdo = s[1]

            try:
                micro_dir = gabarito_direito[lado_direito]
                esc_mem = (lado_direito == '[Rend]')
                if esc_mem:
                    esc_mem = '1'
                else:
                    esc_mem = '0'

                lado_esquerdo = lado_esquerdo.strip().split(' ')
        
                if (len(lado_esquerdo) == 1):
                    micro_esq = ' - ' + gabarito_esquerdo(lado_esquerdo[0].strip(), None, None, lado_direito)

                elif (len(lado_esquerdo) == 2):
                    micro_esq = ' - ' + gabarito_esquerdo(lado_esquerdo[1].strip(), lado_esquerdo[0].strip(), None, lado_direito)

                elif (len(lado_esquerdo) == 3):
                    micro_esq = ' - ' + gabarito_esquerdo(lado_esquerdo[0].strip(), lado_esquerdo[1].strip(), lado_esquerdo[2].strip(), lado_direito)

                file_out.write(l.strip().replace("\n", "").replace("\t", "") + " ")
                file_out.write('\n')
                for i in range(0, 2):
                    file_out.write('0'*13 + micro_esq)
                    file_out.write('\n')
                file_out.write(micro_dir + esc_mem + micro_esq)
                file_out.write('\n')
                file_out.write('\n')
                
            except:
                file_out.write("ERRO!!\n")
        else:

            esc_mem = '0'
            mux = '0'
            micro_dir = '0'*12
            micro_esq = s[0].strip().replace("\n", "").replace("\t", "")
            op = micro_esq[:3]
            if (op == 'cmp'):
                micro_esq = micro_esq[3:]
                micro_esq = micro_esq.split(',')

                a = micro_esq[0].strip().replace("\n", "").replace("\t", "")
                b = micro_esq[1].strip().replace("\n", "").replace("\t", "")
                micro_esq = ' - ' + ULA['-'] + muxA[b] + muxB[a] + mux

            file_out.write(s[0].strip().replace("\n", "").replace("\t", "") + " ")
            file_out.write("\n")
            for i in range(0, 2):
                file_out.write('0'*13 + micro_esq)
                file_out.write('\n')
            file_out.write(micro_dir + esc_mem + micro_esq)
            file_out.write('\n')
            file_out.write('\n')  

    file_out.close()

if __name__ == '__main__':
    value = ""

    if len(sys.argv) > 1:
        value = sys.argv[1]

    main(value)
